#include<iostream>

using namespace std ;

const int maxn = 100010 ;

//head表示头节点
//e[]用来存放结点的值 ， ne[]表示 每个节点的next值
//idx表示当前分配到哪个点了
int head , e[maxn] , ne[maxn] , idx ;


//单链表的初始化
void init() {
    head = -1 ; //-1的地址相当于 null
    idx= 0 ;    //数组的值从 0 开始分配
}

//单链表的头插法
void add_to_head(int x) {
    e[idx] = x ;    //相当于 new
    ne[idx] = head ;
    head = idx ;
    idx ++;
}

//将 x 插入到下标是 k 的结点的后面        --> k是第 n 个插入的数
void add(int x , int  k) {
    //题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数，则按照插入的时间顺序，这 n 个数依次为：第 1个插入的数，第 2
    // 个插入的数，…第 n 个插入的数。

    //但是因为是从 0 开始插入的 ， 所以第 k 个数实际上是第 k - 1 个数


    //这里因为是插在后面。所以不用找到 k - 1
    e[idx] = x ;
    ne[idx] = ne[k] ;
    ne[k] = idx ;
    idx ++ ;
}

//将下标是 k 的结点后面一个结点删除
void remove(int k ){
    ne[k] = ne[ne[k]] ;
}

int main() {

    int m = 0;
    cin >> m;

    init();

    while(m--){
        int k , x ;
        char op ;
        cin >> op ;
        switch(op) {
            case 'H' :
                cin >> x ;
                add_to_head(x);
                break ;
            case 'D' :
                cin >> k;
                if(k == 0){     //删除的结点为头节点，那就把头节点的下一个结点变成头节点
                    head = ne[head] ;
                }
                remove(k - 1);
                break;
            case 'I' :
                cin >> k >> x ;
                add(x , k - 1);
                break;
        }
    }

    for(int i = head ;  i !=  -1 ;i = ne[i]) {
        cout << e[i] << ' ' ;
    }

    return 0;
}